package ar.com.sectorwine.jms;

import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.atomic.AtomicInteger;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import ar.com.sectorwine.entities.Conversacion;
import ar.com.sectorwine.entities.Mensaje;
import ar.com.sectorwine.entities.Users;
import ar.com.sectorwine.repository.ConversacionRepository;
import ar.com.sectorwine.repository.UsuariosDAO;

@Component
public class JmsMessageListener implements MessageListener {

	private static final Logger logger = LoggerFactory
			.getLogger(JmsMessageListener.class);

	@Autowired
	private AtomicInteger counter;

	@Autowired
	private ConversacionRepository conversacionRepository;

	@Autowired
	private UsuariosDAO usuariosDao;

	/**
	 * Implementation of <code>MessageListener</code>.
	 */
	@Transactional
	public void onMessage(Message message) {
		try {
			int messageCount = message
					.getIntProperty(JmsMessageProducer.MESSAGE_COUNT);

			if (message instanceof TextMessage) {
				TextMessage tm = (TextMessage) message;
				String msg = tm.getText();

				logger.info("Processed message '{}'.  value={}", msg,
						messageCount);

				int count = message
						.getIntProperty(JmsMessageProducer.MESSAGE_COUNT);
				String from = message
						.getStringProperty(JmsMessageProducer.MESSAGE_FROM);
				String to = message
						.getStringProperty(JmsMessageProducer.MESSAGE_TO);

				logger.info("-----> Saving: /n message #" + count + ": " + msg
						+ "to: " + to + "from: " + from);

				Users userFrom = usuariosDao.findByUserName(from);
				Users userTo = usuariosDao.findByUserName(to);
				if (userFrom != null && userTo != null) {
					Conversacion conversacion = conversacionRepository
							.findByFromAndTo(userFrom, userTo);
					
					if (conversacion == null) {
					
						conversacion = conversacionRepository
								.findByFromAndTo(userTo, userFrom);
						
						if (conversacion == null) {							
							conversacion = new Conversacion();
							conversacion.setFrom(userFrom);
							conversacion.setTo(userTo);
							conversacion.setMensajes(new ArrayList<Mensaje>());
						}
						
					}

					Mensaje mensaje = new Mensaje();

					mensaje.setEscritor(userFrom);
					mensaje.setFecha(new Date());
					mensaje.setSecuenceNumber(count);
					mensaje.setMensaje(msg);

					conversacion.getMensajes().add(mensaje);

					conversacionRepository.save(conversacion);
				}
				counter.incrementAndGet();
			}
		} catch (JMSException e) {
			logger.error(e.getMessage(), e);
		}
	}

}
